6.2 匿名字段

可以像访问匿名字段成员那样调用其方法,由编译器负责查找。

type data struct{ 
   sync.Mutex
   buf[1024]byte
} 
  
func main() { 
   d:=data{} 
   d.Lock()            // 编译会处理为sync.(*Mutex).Lock() 调用 
   defer d.Unlock() 
}

方法也会有同名遮蔽问题。但利用这种特性,可实现类似覆盖(override)操作。

type user struct{} 
  
type manager struct{ 
   user
} 
  
func(user)toString()string{ 
   return"user" 
} 
  
func(m manager)toString()string{ 
   return m.user.toString() + ";manager" 
} 
  
func main() { 
   var m manager
  
   println(m.toString()) 
   println(m.user.toString()) 
}

输出:

user;manager
user

尽管能直接访问匿名字段的成员和方法,但它们依然不属于继承关系。